package com.Offer;

/*
    面试题16：数值的整数次方
    题目描述：给定一个 double 类型的浮点数 base 和 int 类型的整数 exponent。
    求 base 的 exponent 次方。不得使用库函数，不需要考虑大数问题
 */
public class demo16 {
    public static void main(String[] args) {
        System.out.println(Power(2.5,10));
    }

    public static double Power(double base,int exponent){
        double res = 0;

        if(equal(base,0)){
            return 0;
        }

        if(exponent == 0){
            return 1.0;
        }

        if(exponent > 0){
            res = mutiply(base,exponent);
        }else{
            res = mutiply(1/base,-exponent);
        }
        return res;
    }

    public static double mutiply(double base,int exponent){
        if(exponent == 0)
            return 1;
        if(exponent == 1)
            return base;

        //假设目标求2的32次方，res此时为2的16次方，等式右边嵌套的是递归
        double res = mutiply(base,exponent>>1);
        //然后在用res乘上res就是2的32次方
        res *= res;
        //用于判断次数是奇数还是偶数
        if((exponent & 0x1) == 1)
            res *= base;
        return res;
    }

    public static boolean equal(double a,double b){
        if(a-b < 0.000001 && a-b > -0.000001){
            return true;
        }
        return false;
    }
}
